package com.genericity.demo10;

import com.objects.demo01.A;

import java.util.ArrayList;
import java.util.Arrays;

public class Test {
    public static void main(String[] args) {
        System.out.println("泛型数组测试");
        /**
         * 定义泛型数组
         */
        // 这种定义是错的，不能直创建带泛型的数组对象有 <> 括号就是代表泛型了
        //ArrayList<String>[] array = new ArrayList<>()[5];
        /**
         * 定义方式一
         * 1.先定义数组引用
         * 2.后赋值引用变量
         */
        ArrayList<String>[] listArr; // 这就是可以声明泛型的数组引用
        // 创建原数组
        ArrayList[] list = new ArrayList[5]; // 创建原数
        // 赋值
        listArr = list;
        // 创建整型泛型类
        ArrayList<Integer> intList = new ArrayList<>();
        intList.add(100);
        /**
         * 这种方式会存在一个问题，在使用数组时
         * 原生数组对象是可以直接赋值的，但不同数据类型的引用指向一样
         * 容易发生类型转换错误
         */
        list[0] = intList;
        /**
         * 使用 listArr 获取变量 ,因为 listArr 和 list指定同一个地址，数组创建不可变
         * listArr[0] 其实就是获取 list[0] 元素
         */
        //String s = listArr[0].get(0);
        /**
         * 报错 ClassCastException 类型转换错误
         * Integer cannot be cast to String（整型不能转换成为字符串）
         */
        //System.out.println(s); // 报错

        // 所以不建议使用上面方式创建泛型数组
        // 方式二、直接创建
        ArrayList<String>[] strList = new ArrayList[5];
        ArrayList<Integer> integersList = new ArrayList<>();
        integersList.add(200);
        // 这样就无法添加了,直接泛型检查了
        // strList[0] = integersList;
        ArrayList<String> testList = new ArrayList<>();
        testList.add("测试");
        strList[0] = testList;
        System.out.println(strList[0].get(0));// 测试
        System.out.println("============");
        // 还有一种方式 利用：Array的newInstance创建泛型数组
        String[] str = {"a","b","c","d","e"};
        Fruit<String> stringFruit = new Fruit<>(String.class, str.length);
        // 填充数据
        for (int i = 0; i < str.length; i++) {
            stringFruit.put(i,str[i]);
        }
        // 获取数据
        String s1 = stringFruit.get(1);
        System.out.println(s1);
        // 获取整个数组
        String[] array = stringFruit.getArray();
        // 打印数组
        System.out.println(Arrays.toString(array));
    }
}
